package ig.metrica.ui.modelo;

import java.awt.BorderLayout;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Iterator;

import ig.finanzas.TasaPK;
import ig.finanzas.riesgo.FactorRiesgoPersonal;
import ig.metrica.origenesdedatos.OrigenDeDatos;
import ig.metrica.ui.PantallaSevinproPanel;
import ig.metrica.ui.modelo.modelotablas.ModeloTablaPDCEF;
import ig.util.CellRenderSelectModel;
import ig.util.ejb.IGLlavePrimaria;
import java.util.Collection;
import java.util.Enumeration;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.FinderException;
import javax.naming.NamingException;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;

public class PantallaDefinicionCambioEsperadoFactores extends PantallaSevinproPanel implements TableModelListener {

    private PantallaAsociacionFactorContrato pantalla1;
    private PantallaAsociacionFactoresMatriz pantalla2;
    private JTable tablaFactores;
    private JTable tablaMonedas;

    private JComboBox[] comboBoxsColumns=new JComboBox[7];

    @Override
    public JComboBox[] getComboBoxsColumnsTable1() {
        return comboBoxsColumns;
    }

    private JComboBox[] comboBoxsColumnsTable2=new JComboBox[0];
    @Override
    public JComboBox[] getComboBoxsColumnsTable2() {
        return comboBoxsColumnsTable2;
    }

    //private JlEstadoModeo dmodelo;
    public PantallaDefinicionCambioEsperadoFactores(PantallaAsociacionFactorContrato pantalla1, PantallaAsociacionFactoresMatriz pantalla2, PantallaDatosBasicosModelo datosbasicos, ThreadModelos threadModelos) throws RemoteException, NamingException, FinderException, ClassNotFoundException, SQLException, Exception {
        this.threadModelos = threadModelos;
        this.datosbasicos = datosbasicos;
        JTabbedPane pestanas;        
        setLayout(new BorderLayout());

        add(pestanas = new JTabbedPane(), BorderLayout.CENTER);
        pestanas.add("Factores", new JScrollPane(tablaFactores = new JTable(new ModeloTablaPDCEF(pantalla1, new Hashtable(), this))));
        pestanas.add("Monedas", new JScrollPane(tablaMonedas = new JTable(new ModeloTablaPDCEF(pantalla1, new Hashtable(), this))));

        JComboBox comboTipoVolatilidad = new JComboBox();
        comboTipoVolatilidad.addItem(new String("REGISTRADO"));
        comboTipoVolatilidad.addItem(new String("ESPECIFICADO"));
        comboTipoVolatilidad.addItem(new String("NORMAL"));
        comboTipoVolatilidad.addItem(new String("EWMA"));
        comboTipoVolatilidad.addItem(new String("DIFERENCIA"));
        comboTipoVolatilidad.addItem(new String("DIFERENCIA_SIN_PROMEDIO"));
        comboTipoVolatilidad.addItem(new String("VOLATILIDAD_MAXIMA"));

        /*
         * Modificado por Cristhiam Reina
         * 5 marzo del 2011
         * Agregar nuevo item al objeto comboTipoDiferencia comboTipoVolatilidad
         */
        comboTipoVolatilidad.addItem(new String("SIMULACION HISTORICA"));

        /*
         * Modificado por Cristhiam Reina
         * 7 Febrero del 2012
         * Agregar nuevo item al objeto comboTipoDiferencia comboTipoVolatilidad
         */
        comboTipoVolatilidad.addItem(new String("REGRESION LINEAL"));

        JComboBox comboTipoDiferencia = new JComboBox();
        comboTipoDiferencia.addItem(new String("ARITMETICA"));
        comboTipoDiferencia.addItem(new String("LOGARITMICA"));
        /*
         * Modificado por Cristhiam Reina
         * 5 marzo del 2011
         * Agregar nuevo item al objeto comboTipoDiferencia
         */
        comboTipoDiferencia.addItem(new String("GEOMETRICA"));
        /*
         * Modificado por Eliecer Cortes
         * 1 de Septiembre de 2011
         * Agregar nuevo item al objeto comboTipoDiferencia
         */
        comboTipoDiferencia.addItem(new String("NO CALCULAR"));

        TableColumn col1 = tablaFactores.getColumnModel().getColumn(1);
        TableColumn col2 = tablaMonedas.getColumnModel().getColumn(1);
        TableColumn col3 = tablaFactores.getColumnModel().getColumn(7);
        TableColumn col4 = tablaMonedas.getColumnModel().getColumn(7);

        col1.setCellEditor(new DefaultCellEditor(comboTipoVolatilidad));
        col2.setCellEditor(new DefaultCellEditor(comboTipoVolatilidad));
        col3.setCellEditor(new DefaultCellEditor(comboTipoDiferencia));
        col4.setCellEditor(new DefaultCellEditor(comboTipoDiferencia));

        this.pantalla1 = pantalla1;
        this.pantalla2 = pantalla2;

        tablaFactores.getTableHeader().setReorderingAllowed(false);
        tablaMonedas.getTableHeader().setReorderingAllowed(false);

        tablaFactores.setComponentPopupMenu(EditarTabla);
        tablaMonedas.setComponentPopupMenu(EditarTabla);

        comboBoxsColumns[0]=comboTipoVolatilidad;
        comboBoxsColumns[6]=comboTipoDiferencia;

        //tablaMonedas.setDefaultRenderer(Object.class, new CellRenderSelectModel());
        //tablaFactores.setDefaultRenderer(Object.class, new CellRenderSelectModel());

        pantalla1.suscribirEscucha(this);
    }

    public String getTitulo() {
        return "Definicion del Calculo del Cambio Esperado";
    }

    public void setModificable(boolean b) {
        tablaFactores.setEnabled(b);
        tablaMonedas.setEnabled(b);
    }

    public void limpiarCampos() throws Exception {
//		if(dmodelo!=null)dmodelo.setSalida("    Cambio esperado factore");
        setRelacionMonedasFactores(pantalla2.getRelacionMonedasFactores());

        //------------------------------------------------------------------

        tableChanged(null);

    }

    public void tableChanged(TableModelEvent e) {

        Iterator i;

        Hashtable relacionProductosFactores = pantalla1.getRelacionProductosFactores();
        Hashtable relacionEspeciesFactores = pantalla1.getRelacionEspeciesFactores();

        ArrayList factorestasasregistradas = new ArrayList();
        Hashtable factorespersonales = new Hashtable();

        ArrayList temp = new ArrayList();
        i = relacionProductosFactores.keySet().iterator();
        while (i.hasNext()) {
            temp.add(i.next());
        }

        i = relacionEspeciesFactores.keySet().iterator();
        while (i.hasNext()) {
            temp.add(i.next());
        }


        i = temp.iterator();

        while (i.hasNext()) {
            IGLlavePrimaria llave = (IGLlavePrimaria) i.next();
            FactorRiesgoPersonal factor = (FactorRiesgoPersonal) relacionProductosFactores.get(llave);
            if (factor == null) {
                factor = (FactorRiesgoPersonal) relacionEspeciesFactores.get(llave);
            }

            if (factor.getTipo() == FactorRiesgoPersonal.TIPO_FACTORPRECIO) {
                factorespersonales.put(llave, factor);
            } else if (factor.getTipo() == FactorRiesgoPersonal.TIPO_FACTORTASA) {
                TasaPK tasaPK = factor.getTasaPK();
                //////////verifica algo bien estraño sobre la adicion de nuevos tasasa a algo medio loco
                boolean adicionar = true;
                Enumeration iterator = factorespersonales.keys();
                while (iterator.hasMoreElements()) {
                    Object obj = iterator.nextElement();
                    if (tasaPK.toString().trim().equals(obj.toString().trim()) && !(tasaPK.toString().equals(obj.toString()))) {
                        adicionar = false;
                    }
                }
                //////////
                if (!factorestasasregistradas.contains(tasaPK) && adicionar) {
                    factorespersonales.put(tasaPK, factor);
                }
            } else {
//                System.out.println(this.getClass().getName()+" Es para TASA DE DESCUENTO.");
                factorespersonales.put(llave, factor);
            }
        }
        ((ModeloTablaPDCEF) tablaFactores.getModel()).setRelacionFactoresPantalla(pantalla1.getRelacionEspeciesFactoresPantalla());
        ((ModeloTablaPDCEF) tablaFactores.getModel()).setRelacionFactores(factorespersonales);

    }

    public void setRelacionFactores(Hashtable relacion) {
        ((ModeloTablaPDCEF) tablaFactores.getModel()).setRelacionFactores(relacion);
    }

    public Hashtable getRelacionFactores() {
        return ((ModeloTablaPDCEF) tablaFactores.getModel()).getRelacionFactores();
    }

    public void setRelacionMonedasFactores(Hashtable relacion) {
        ((ModeloTablaPDCEF) tablaMonedas.getModel()).setRelacionFactores(relacion);
    }

    private List keyAdd = new ArrayList();
    @Override
    public List getKeyAdd(){
        return keyAdd;
    }

    public void setKeyAdd(List list){
        this.keyAdd = list;
    }
    public Hashtable getRelacionMonedasFactores() {
        return ((ModeloTablaPDCEF) tablaMonedas.getModel()).getRelacionFactores();
    }
    Collection origenesdatsoOK = new ArrayList();

    public void salir() throws Exception {
        for (Object elem : origenesdatsoOK) {
            ((OrigenDeDatos) elem).closePoolConnection();
        }
        ((ModeloTablaPDCEF) this.tablaFactores.getModel()).salir();
    }

}

